package com.yuju.group.service.impl;

import java.text.DecimalFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yuju.enums.ReturnCodeEnum;
import com.yuju.enums.SeqCodeEnum;
import com.yuju.exception.BusinessException;
import com.yuju.group.dao.ISeqCodeDao;
import com.yuju.group.model.SeqCodeModel;
import com.yuju.group.service.ICodeGenService;
import com.yuju.util.Format;
import com.yuju.util.Utils;

/**
 * 
 * 类名：CodeGenServiceImpl  <br />
 *
 * 功能：生成编码
 *
 * @author : xuehj <br />
 * @Date : 2017年12月2日 下午3:58:47  <br />
 * @version : 1.1 <br />
 */
@Service
public class CodeGenServiceImpl implements ICodeGenService {
	@Autowired
	private ISeqCodeDao seqCodeDao;

	/**
	 * 
	 * 功能：获取编码<br/>
	 * 集团内新增的编码不需要传hotelId, hotelCode，或者将其设置为null
	 * 酒店内编码需要传递hotelId, hotelCode
	 * @author xuehj
	 * @param groupId 集团ID
	 * @param hotelId 酒店ID
	 * @param hotelCode 酒店编码
	 * @param type 编码类型
	 * @Date 2017年12月2日 上午8:58:36 <br/>
	 */
	@Override
	public String generate(String groupId, String hotelId, String hotelCode, String type) {
		// TODO Auto-generated method stub
		Map<Object, Object> map = new HashMap<Object, Object>();
		map.put("type", type);
		if (null == groupId) {
			return generatorSysSeqCode(map);
		} else {
			if (Utils.isNull(hotelId)) {
				map.put("groupId", groupId);
				return generatorGrpSeqCode(map);
			} else {
				map.put("hotelId", hotelId);
				map.put("hotelCode", hotelCode);
				return generatorGrpSeqCode(map);
			}
		}
	}
	
	/**
	 * 
	 * 功能：生成编码<br/>
	 * @param map 参数列表
	 * @author xuehj
	 * @Date 2017年12月2日 上午10:35:12 <br/>
	 */
	public String generatorGrpSeqCode(Map<Object, Object> map) {
		SeqCodeModel seqCodeModel = seqCodeDao.getSeqCode(map);
		if (seqCodeModel == null) {
			throw new BusinessException(ReturnCodeEnum.ORDER_NO_GEN_FALURE.getCode(), ReturnCodeEnum.ORDER_NO_GEN_FALURE.getDesc());
		}
		// 编码前缀
		String prefix = seqCodeModel.getPrefix();
		// 判断是否每天都初始化编码
		if (seqCodeModel.getIsResetForDate() == 1) {
			// 判断是否本天的第一条数据
			String currentDay = Format.todayNoTime();
			if (!currentDay.equals(Format.getDateStr2(seqCodeModel.getGmtModified()).substring(0, 8))) {
				// 不相等，则code重置
				seqCodeModel.setSeqCode(1L);
			} else {
				seqCodeModel.setSeqCode(seqCodeModel.getSeqCode() + 1);
			}
			if (!SeqCodeEnum.HOTEL_CODE.equals(map.get("type"))
					|| !SeqCodeEnum.DEPT_CODE.equals(map.get("type"))
						|| !SeqCodeEnum.EMP_CODE.equals(map.get("type"))) {
				prefix = prefix + map.get("hotelCode") + currentDay;
			} else {
				prefix += currentDay;
			}
		} else {
			seqCodeModel.setSeqCode(seqCodeModel.getSeqCode() + 1);
		}
		seqCodeModel.setGmtModified(new Date());
		seqCodeDao.updateSelective(seqCodeModel);
		
		// 编码长度
		long codeLength = seqCodeModel.getLength();
		// 当前序列号
		long seqCode = seqCodeModel.getSeqCode();
		
		return getSeqCode(prefix, codeLength, seqCode);
	}
	
	/**
	 * 
	 * 功能：生成系统级编码<br/>
	 * @param map 参数列表
	 * @author xuehj
	 * @Date 2017年12月2日 上午10:35:12 <br/>
	 */
	public String generatorSysSeqCode(Map<Object, Object> map) {
		SeqCodeModel seqCodeModel = seqCodeDao.getSysSeqCode(map);
		if (seqCodeModel == null) {
			throw new BusinessException(ReturnCodeEnum.ORDER_NO_GEN_FALURE.getCode(), ReturnCodeEnum.ORDER_NO_GEN_FALURE.getDesc());
		}
		// 编码前缀
		String prefix = seqCodeModel.getPrefix();
		// 判断是否每天都初始化编码
		if (seqCodeModel.getIsResetForDate() == 1) {
			// 判断是否本天的第一条数据
			String currentDay = Format.todayNoTime();
			if (!currentDay.equals(Format.getDateStr2(seqCodeModel.getGmtModified()).substring(0, 8))) {
				// 不相等，则code重置
				seqCodeModel.setSeqCode(1L);
			} else {
				seqCodeModel.setSeqCode(seqCodeModel.getSeqCode() + 1);
			}
			if (!SeqCodeEnum.HOTEL_CODE.equals(map.get("type"))
					|| !SeqCodeEnum.DEPT_CODE.equals(map.get("type"))
						|| !SeqCodeEnum.EMP_CODE.equals(map.get("type"))) {
				prefix = prefix + map.get("hotelCode") + currentDay;
			} else {
				prefix += currentDay;
			}
		} else {
			seqCodeModel.setSeqCode(seqCodeModel.getSeqCode() + 1);
		}
		seqCodeModel.setGmtModified(new Date());
		seqCodeDao.updateSysSeqCode(seqCodeModel);
		
		// 编码长度
		long codeLength = seqCodeModel.getLength();
		// 当前序列号
		long seqCode = seqCodeModel.getSeqCode();
		
		return getSeqCode(prefix, codeLength, seqCode);
	}
	
	/**
	 * 
	 * 功能：返回最终的编码格式<br/>
	 * @param prefix 前缀
	 * @param codeLength 编码长度
	 * @param seqCode 序号值
	 * @author xuehj
	 * @Date 2017年12月8日 下午5:02:10 <br/>
	 */
	private String getSeqCode(String prefix, long codeLength, long seqCode) {
		String fullSeqCode = genFullSeqCode(codeLength, seqCode);
		if (Utils.isNull(prefix)) {
			prefix = "";
		}
		return prefix + fullSeqCode;
	}
	
	/**
	 * 
	 * 功能：将编码用0补齐<br/>
	 * @param codeLength 编码长度
	 * @param seqCode 序列号值
	 * @author xuehj
	 * @Date 2017年12月8日 下午5:00:39 <br/>
	 */
	private String genFullSeqCode(long codeLength, long seqCode) {
		StringBuffer codeFill = new StringBuffer();
		for (int i=0; i<codeLength; i++) {
			codeFill.append("0");
		}
		DecimalFormat df = new DecimalFormat(codeFill.toString());
		return df.format(seqCode);
	}

}
